package com.ruge.system.service.impl;

import com.ruge.common.util.GsonUtil;
import com.ruge.common.util.ShiroUtil;
import com.ruge.common.util.TreeUtil;
import com.ruge.system.pojo.entity.SysMenu;
import com.ruge.system.pojo.entity.SysRoleMenu;
import com.ruge.system.repository.SysMenuRepository;
import com.ruge.system.repository.SysRoleMenuRepository;
import com.ruge.system.pojo.request.MenuRequest;
import com.ruge.system.service.SysMenuService;
import com.ruge.system.pojo.vo.ActiveUser;
import com.ruge.system.pojo.vo.MenuTableVo;
import com.ruge.system.pojo.vo.MenuVo;
import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 创建人 ：爱丽丝、如歌
 * 创建时间 ：2020-03-05  21:08
 * 描述 ：
 *
 * @author Administrator
 */
@Service
public class SysMenuServiceImpl implements SysMenuService {
    @Resource
    private SysMenuRepository sysMenuRepository;
    @Resource
    private SysRoleMenuRepository sysRoleMenuRepository;

    /**
     * 通过角色id 查询 菜单列表
     *
     * @param roleId 角色id
     * @return
     */
    @Override
    public List<SysMenu> findAllBySysRole_Id(Long roleId) {
        List<SysRoleMenu> menuIds = sysRoleMenuRepository.findAllBySysRole_Id(roleId);
        List<SysMenu> list = new ArrayList<>();
        for (SysRoleMenu e : menuIds) {
            sysMenuRepository.findById(e.getSysMenu().getId()).ifPresent(list::add);
        }
        return list;
    }

    /**
     * 查询接口
     *
     * @param model
     * @return
     */
    @Override
    public Page<MenuTableVo> findAll(MenuRequest model) {
        Specification<SysMenu> specification = (root, query, cb) -> {
            /**
             * 获取条件对象
             */
            Predicate conjunction = cb.conjunction();
            if (model != null) {
                if (null != model.getId()) {
                    conjunction.getExpressions().add(cb.equal(root.get("id"), model.getId()));
                }
            }
            return conjunction;
        };
        Sort sort = Sort.by(Sort.Order.desc("sort"));
        Pageable pageable = PageRequest.of(model != null ? model.getPage() : 0, model != null ? model.getLimit() : 15, sort);
        Page<SysMenu> page = sysMenuRepository.findAll(specification, pageable);
        return new PageImpl<>(GsonUtil.GsonToListVo(page.getContent(), MenuTableVo.class), pageable, page.getTotalElements());
    }

    /**
     * 菜单查询接口 不分页
     *
     * @param model
     * @return
     */
    @Override
    public List<MenuTableVo> findAllNoPage(MenuRequest model) {
        Specification<SysMenu> specification = (root, query, cb) -> {
            /**
             * 获取条件对象
             */
            Predicate conjunction = cb.conjunction();
            if (model != null) {
                if (null != model.getId()) {
                    conjunction.getExpressions().add(cb.equal(root.get("id"), model.getId()));
                }
            }
            return conjunction;
        };
        Sort sort = Sort.by(Sort.Order.desc("sort"));
        List<SysMenu> page = sysMenuRepository.findAll(specification, sort);
        return GsonUtil.GsonToListVo(page, MenuTableVo.class);
    }

    /**
     * 超级管理员 加载菜单
     *
     * @return
     */
    @Override
    public List<SysMenu> findAll() {
        return sysMenuRepository.findAll();
    }

    /**
     * 保存接口
     *
     * @param sysMenu
     * @return
     */
    @Override
    public SysMenu save(SysMenu sysMenu) {
        return sysMenuRepository.save(sysMenu);
    }

    /**
     * 数据删除接口
     *
     * @param id
     * @return
     */
    @Override
    public void deleteById(Long id) {
        ActiveUser activeUser = ShiroUtil.getActiveUser();
        List<SysMenu> permissions = new ArrayList<>(activeUser.getPermissions());
        List<MenuVo> tree = TreeUtil.toTree(GsonUtil.GsonToListVo(permissions, MenuVo.class), id);
        sysMenuRepository.deleteById(id);
        sysRoleMenuRepository.deleteBySysMenu_Id(id);
    }

    /**
     * 批量操作
     *
     * @param map
     * @return
     */
    @Override
    public List<SysMenu> batch(Map<String, List<SysMenu>> map) {
        return sysMenuRepository.batch(map);
    }
}
